package gui.tables;

import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map.Entry;
import java.util.SortedMap;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

import org.jdom.JDOMException;
import start.Config;
import xml.XMLRecipeReader;
import xml.XMLRecipeSaver;

/**
 * Checkbox-Tabelle fuer Uebersichtspanel
 * @author dennis-wittkoetter
 *
 */
public class OverviewTable extends JTableHeaderCheckBox {
	private static Object[] colNames = {"Name","Kategorien","Bewertung","ID"};
	private static boolean isSetCheckBox = false;
	
	/**
	 * Konstruiert eine Checkbox-Tabelle fuer die Rezeptauflistung des Ubersichtspanels
	 */
	public OverviewTable() {
		super(colNames);
		dtm = new DefaultTableModel(data, columnNames) {
			private static final long serialVersionUID = 1L;

			@Override public boolean isCellEditable(int row, int col) {
		        if (col > 0) return false;
		        return true;
		    }
		    
		};
		table = new JTable(dtm);
		
        table.getColumnModel().getColumn(1).setPreferredWidth(250);
        table.getColumnModel().getColumn(2).setPreferredWidth(200);
        table.getColumnModel().removeColumn(table.getColumnModel().getColumn(4));	//ID-Spalte ausblenden
	}
	
	/**
	 * Erstellt das Panel fuer die OverviewTabel
	 */
	@Override public JPanel buildPanel() {
		//Spalten konfigurieren:
	    //Checkbox-Spalte ist 25px breit, fix und nicht veraenderbar 
	    table.getColumnModel().getColumn(0).setPreferredWidth(25);
	    table.getColumnModel().getColumn(0).setMaxWidth(25);
	    table.getColumnModel().getColumn(0).setResizable(false);
	    
		JScrollPane sp = new JScrollPane(table);  
	    TableColumn tc = table.getColumnModel().getColumn(0);  
	    tc.setCellEditor(table.getDefaultEditor(Boolean.class));  
	    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));  
	    tc.setHeaderRenderer(new CheckBoxHeader(new MyItemListenerOverview()));
	    //table.getColumnModel().getColumn(3).setHeaderRenderer(new RatingCellHeaderRenderer());
	    
	    table.getColumnModel().getColumn(3).setCellRenderer(new RatingCellRenderer());
	    JPanel p = new JPanel(new BorderLayout());
	    p.add(sp);
	    return p;
	}
	
	/**
	 * Schreibt den Tabelleninhalt auf Basis einer XML mit Kategorie-Inhalten neu
	 * @param xml	XML-Reader zum Auslesen von Rezepten
	 * @throws IOException 
	 * @throws JDOMException 
	 */
	public boolean updateFromXML(XMLRecipeReader xml) throws JDOMException, IOException {
		Object[] data = new Object[5];		//Zwischenspeicher fuer XML-Inhalte
		SortedMap<String,List<String>>content = xml.convertToTable();
		
		//Abbruch wenn XML leer
		dtm.setRowCount(0);		//alten Tabelleninhalt loeschen
		if (content.isEmpty())	return false;
		
		
		//Ueber SortedMap iterieren und Datensaetze in Tabelle schreiben
		for (Entry<String, List<String>> entry : content.entrySet()) {
            System.out.printf("%s hat %s\n", entry.getKey(), entry.getValue());
        
			data[0] = isSetCheckBox;	//Checkbox nicht abgehakt
			data[1] = entry.getKey();
			data[2] = entry.getValue().get(0);
			data[3] = entry.getValue().get(1);
			data[4] = entry.getValue().get(2);
			
			dtm.addRow(data);
		}
		content.clear();	//Liste loeschen
		
		return true;
	}
	
	/**
	 * Entfernt alle per Checkbox selektierten Eintraege aus der angegebenen XML
	 * @param xml	Saver-Objekt der zu bearbeitenden XML
	 * @throws JDOMException
	 * @throws IOException
	 */
	public void removeCheckedEntries(XMLRecipeSaver xml) throws JDOMException, IOException {
		for(int i=0; i<dtm.getRowCount(); i++) {
			if (dtm.getValueAt(i, 0).toString().equalsIgnoreCase("true")) {
				if (Config.debugMode()) {	//DEBUG
					String id = dtm.getValueAt(i, 4).toString();
					System.out.println(id+" - XML-Index: "+xml.getIndex(id));
				}
				
				//Erst Bilder loeschen
				try {
					//System.out.println(table.getTable().getSelectedRow());
					int recipeID = Integer.parseInt(getValueAt(i, 4).toString());
					//System.out.println("ID: " + table.getTable().getSelectedRow());
					new File(Config.getBildpfad() + "image_" + recipeID + ".jpg").delete();
					new File(Config.getThumbpfad() + "thumbnail_" + recipeID + ".jpg").delete();
				} catch(SecurityException e) {} //nichts tun
				
				xml.remove(dtm.getValueAt(i, 4).toString());
				xml.createXMLFile();
			}
		}
	}
	
	/**
	 * Entfernt den Eintrag der aktuell ausgewaehlten Zeile in der angegebenen XML
	 * @param xml	Saver-Objekt der zu bearbeitenden XML
	 * @throws IOException
	 * @throws JDOMException
	 */
	public void removeSelectedRow(XMLRecipeSaver xml) throws IOException, JDOMException {
		int selRow = table.getSelectedRow();
		
		if (selRow < table.getRowCount()) {
			if (selRow != -1 && this.getCheckedRowCount()==0) {
				xml.remove(dtm.getValueAt(selRow, 1).toString());
				xml.createXMLFile();
			}
		}
	}
	
	/**
	 * Entfernt die Eintraege der aktuell ausgewaehlten Zeilen in der angegebenen XML
	 * @param xml	Saver-Objekt der zu bearbeitenden XML
	 * @throws IOException
	 * @throws JDOMException
	 */
	public void removeSelectedRows(XMLRecipeSaver xml) throws IOException, JDOMException {
		//int selRow = table.getSelectedRow();
		int[] selRows = table.getSelectedRows();
		
		if (selRows != null && this.getCheckedRowCount()==0) {
			for (int i=0; i<selRows.length; i++) {			
				xml.remove(dtm.getValueAt(selRows[i], 1).toString());
				xml.createXMLFile();
			}
		}
	}
	/**
	 * Setzt die Header-Checkbox der Tabelle
	 * @param a Wert der Checkbox
	 */
	public static void setHeaderCheckBox(boolean a) {
		isSetCheckBox = a;
	}
}

/**
 * Spezieller HeaderRenderer um Header-Zellen der OverviewTable zu manipulieren
 * @author Dennis Wittkoetter
 *
 */
class OverviewTableHeaderRenderer extends JLabel implements TableCellRenderer {
	/**ID zur Serialisierung*/
	private static final long serialVersionUID = 1L;
	/**zu rendernde Komponente des TableHeaders*/
	protected OverviewTableHeaderRenderer rendererComponent;  
	
    /**
     * Manipuliert eine Zelle des Table-Headers
     * @return	Die manipulierte Komponente
     */
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		
	    setText(value.toString());
	  //Layout-Anpassungen
	    setFont(table.getFont());
	    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
	    setHorizontalAlignment(SwingConstants.CENTER);
	    setOpaque(true);
			
		return this;		
	}
}